From 1ce316cb607a4828a2a1db2a4bf37b56014045c4 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 4 Dec 2024 17:08:55 +0800 Subject: [PATCH] shell_integration/macOS/FileProviderUIExt: Adapt FileProviderUIExt sharing to NextcloudKit 5 Signed-off-by: Claudio Cambra --- .../Sharing/ShareController.swift | 16 ++++++-- .../Sharing/ShareOptionsView.swift | 17 ++++---- .../Sharing/ShareTableViewDataSource.swift | 39 ++++++++++++------- .../Sharing/ShareViewController.swift | 12 +++--- .../Sharing/ShareeSuggestionsDataSource.swift | 6 ++- 5 files changed, 60 insertions(+), 30 deletions(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareController.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareController.swift index 161d18700..013a897a6 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareController.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareController.swift @@ -7,14 +7,17 @@ import Combine import Foundation +import NextcloudFileProviderKit import NextcloudKit import OSLog class ShareController: ObservableObject { @Published private(set) var share: NKShare private let kit: NextcloudKit + private let account: Account static func create( + account: Account, kit: NextcloudKit, shareType: NKShare.ShareType, itemServerRelativePath: String, @@ -38,6 +41,7 @@ class ShareController: ObservableObject { publicUpload: publicUpload, password: password, permissions: permissions, + account: account.ncKitAccount, options: options ) { account, share, data, error in defer { continuation.resume(returning: error) } @@ -65,8 +69,8 @@ class ShareController: ObservableObject { shareWith: shareWith, password: password, permissions: permissions, - options: options, - attributes: attributes + attributes: attributes, + account: account.ncKitAccount ) { account, share, data, error in defer { continuation.resume(returning: error) } guard error == .success else { @@ -82,7 +86,8 @@ class ShareController: ObservableObject { } } - init(share: NKShare, kit: NextcloudKit) { + init(share: NKShare, account: Account, kit: NextcloudKit) { + self.account = account self.share = share self.kit = kit } @@ -110,6 +115,7 @@ class ShareController: ObservableObject { label: label, hideDownload: hideDownload, attributes: attributes, + account: account.ncKitAccount, options: options ) { account, share, data, error in Logger.shareController.info( @@ -134,7 +140,9 @@ class ShareController: ObservableObject { func delete() async -> NKError? { Logger.shareController.info("Deleting share: \(self.share.url, privacy: .public)") return await withCheckedContinuation { continuation in - kit.deleteShare(idShare: share.idShare) { account, error in + kit.deleteShare( + idShare: share.idShare, account: account.ncKitAccount + ) { account, _, error in Logger.shareController.info( """ Received delete response: \(self.share.url, privacy: .public) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareOptionsView.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareOptionsView.swift index 3e16a34cc..5614f2139 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareOptionsView.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareOptionsView.swift @@ -7,6 +7,7 @@ import AppKit import Combine +import NextcloudFileProviderKit import NextcloudKit import OSLog import SuggestionsTextFieldKit @@ -34,16 +35,17 @@ class ShareOptionsView: NSView { @IBOutlet private weak var circleShare: NSMenuItem! @IBOutlet private weak var talkConversationShare: NSMenuItem! - var kit: NextcloudKit? { + let kit = NextcloudKit.shared + var account: Account? { didSet { - Logger.shareOptionsView.info("Setting up the kit.") - guard let kit = kit else { + Logger.shareOptionsView.info("Setting up account.") + guard let account else { Logger.shareOptionsView.error("Could not configure suggestions data source.") return } suggestionsTextFieldDelegate.suggestionsDataSource = ShareeSuggestionsDataSource( - kit: kit + account: account, kit: kit ) suggestionsTextFieldDelegate.confirmationHandler = { suggestion in guard let sharee = suggestion?.data as? NKSharee else { return } @@ -255,13 +257,13 @@ class ShareOptionsView: NSView { guard !createMode else { Logger.shareOptionsView.info("Creating new share!") - guard let dataSource = dataSource, - let kit = kit, + guard let dataSource, + let account, let itemServerRelativePath = dataSource.itemServerRelativePath else { Logger.shareOptionsView.error("Cannot create new share due to missing data.") Logger.shareOptionsView.error("dataSource: \(self.dataSource, privacy: .public)") - Logger.shareOptionsView.error("kit: \(self.kit, privacy: .public)") + Logger.shareOptionsView.error("account: \(self.account != nil, privacy: .public)") Logger.shareOptionsView.error( "path: \(self.dataSource?.itemServerRelativePath ?? "", privacy: .public)" ) @@ -280,6 +282,7 @@ class ShareOptionsView: NSView { deleteButton.isEnabled = false saveButton.isEnabled = false let error = await ShareController.create( + account: account, kit: kit, shareType: selectedShareType, itemServerRelativePath: itemServerRelativePath, diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift index 31d9b578f..f315b1635 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift @@ -17,6 +17,8 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele private let shareItemViewNib = NSNib(nibNamed: "ShareTableItemView", bundle: nil) private let reattemptInterval: TimeInterval = 3.0 + let kit = NextcloudKit.shared + var uiDelegate: ShareViewDataSourceUIDelegate? var sharesTableView: NSTableView? { didSet { @@ -30,21 +32,23 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele var capabilities: Capabilities? var itemMetadata: NKFile? - private(set) var kit: NextcloudKit? private(set) var itemURL: URL? private(set) var itemServerRelativePath: String? private(set) var shares: [NKShare] = [] { didSet { Task { @MainActor in sharesTableView?.reloadData() } } } - private var account: Account? { + private(set) var account: Account? { didSet { guard let account = account else { return } - kit = NextcloudKit() - kit?.setup( + kit.appendSession( + account: account.ncKitAccount, + urlBase: account.serverUrl, user: account.username, userId: account.username, password: account.password, - urlBase: account.serverUrl + userAgent: "Nextcloud-macOS/FileProviderUIExt", + nextcloudVersion: 25, + groupIdentifier: "" ) } } @@ -109,11 +113,13 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele presentError("Server does not support shares.") return } - guard let kit else { - presentError("NextcloudKit instance is unavailable, cannot reload data!") + guard let account else { + presentError("Account data is unavailable, cannot reload data!") return } - itemMetadata = await fetchItemMetadata(itemRelativePath: serverPathString, kit: kit) + itemMetadata = await fetchItemMetadata( + itemRelativePath: serverPathString, account: account, kit: kit + ) guard itemMetadata?.permissions.contains("R") == true else { presentError("This file cannot be shared.") return @@ -136,15 +142,17 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele let rawIdentifier = itemIdentifier.rawValue Logger.sharesDataSource.info("Fetching shares for item \(rawIdentifier, privacy: .public)") - guard let kit = kit else { - self.presentError("NextcloudKit instance is unavailable, cannot fetch shares!") + guard let account else { + self.presentError("NextcloudKit instance or account is unavailable, cannot fetch shares!") return [] } let parameter = NKShareParameter(path: itemRelativePath) return await withCheckedContinuation { continuation in - kit.readShares(parameters: parameter) { account, shares, data, error in + kit.readShares( + parameters: parameter, account: account.ncKitAccount + ) { account, shares, data, error in let shareCount = shares?.count ?? 0 Logger.sharesDataSource.info("Received \(shareCount, privacy: .public) shares") defer { continuation.resume(returning: shares ?? []) } @@ -157,9 +165,14 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele } private func fetchCapabilities() async -> Capabilities? { + guard let account else { + self.presentError("Could not fetch capabilities as account is invalid.") + return nil + } + return await withCheckedContinuation { continuation in - kit?.getCapabilities { account, capabilitiesJson, error in - guard error == .success, let capabilitiesJson = capabilitiesJson else { + kit.getCapabilities(account: account.ncKitAccount) { account, data, error in + guard error == .success, let capabilitiesJson = data?.data else { self.presentError("Error getting server caps: \(error.errorDescription)") continuation.resume(returning: nil) return diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareViewController.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareViewController.swift index 058708a65..79f6054c6 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareViewController.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareViewController.swift @@ -144,8 +144,8 @@ class ShareViewController: NSViewController, ShareViewDataSourceUIDelegate { } @IBAction func createShare(_ sender: Any) { - guard let kit = shareDataSource.kit else { return } - optionsView.kit = kit + guard let account = shareDataSource.account else { return } + optionsView.account = account optionsView.createMode = true tableView.deselectAll(self) if !splitView.arrangedSubviews.contains(optionsView) { @@ -176,9 +176,11 @@ class ShareViewController: NSViewController, ShareViewDataSourceUIDelegate { } func showOptions(share: NKShare) { - guard let kit = shareDataSource.kit else { return } - optionsView.kit = kit - optionsView.controller = ShareController(share: share, kit: kit) + guard let account = shareDataSource.account else { return } + optionsView.account = account + optionsView.controller = ShareController( + share: share, account: account, kit: shareDataSource.kit + ) if !splitView.arrangedSubviews.contains(optionsView) { splitView.addArrangedSubview(optionsView) optionsView.isHidden = false diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareeSuggestionsDataSource.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareeSuggestionsDataSource.swift index cc1b91fe3..0987cd728 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareeSuggestionsDataSource.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareeSuggestionsDataSource.swift @@ -6,18 +6,21 @@ // import Foundation +import NextcloudFileProviderKit import NextcloudKit import OSLog import SuggestionsTextFieldKit class ShareeSuggestionsDataSource: SuggestionsDataSource { let kit: NextcloudKit + let account: Account var suggestions: [Suggestion] = [] var inputString: String = "" { didSet { Task { await updateSuggestions() } } } - init(kit: NextcloudKit) { + init(account: Account, kit: NextcloudKit) { + self.account = account self.kit = kit } @@ -35,6 +38,7 @@ class ShareeSuggestionsDataSource: SuggestionsDataSource { search: inputString, page: 1, perPage: 20, + account: account.ncKitAccount, completion: { account, sharees, data, error in defer { continuation.resume(returning: sharees ?? []) } guard error == .success else { -- 2.30.2